/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.servicio.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IBajaLogicaPacienteDAO;
import desarrollosoft.ghce.dao.interfaces.IDiagnosticoDAO;
import desarrollosoft.ghce.dao.interfaces.IElementoDAO;
import desarrollosoft.ghce.dao.interfaces.IGrupoEtarioDAO;
import desarrollosoft.ghce.dao.interfaces.IMonodrogaDAO;
import desarrollosoft.ghce.dao.interfaces.IPromedioDAO;
import desarrollosoft.ghce.dao.interfaces.ISexoDAO;
import desarrollosoft.ghce.entidades.Diagnostico;
import desarrollosoft.ghce.entidades.Elemento;
import desarrollosoft.ghce.entidades.GrupoEtario;
import desarrollosoft.ghce.entidades.Monodroga;
import desarrollosoft.ghce.entidades.Sexo;
import desarrollosoft.ghce.servicio.interfaces.IServicioEstadisticas;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

/**
 *
 * @author ariel
 */
@Service("servicioEstadisticas")
public class ServicioEstadisticas implements IServicioEstadisticas {

    @Autowired
    @Qualifier("sexoDAO")
    private ISexoDAO sexoDAO;
    
    @Autowired
    @Qualifier("diagnosticoDAO")
    private IDiagnosticoDAO diagnosticoDAO;
    
    @Autowired
    @Qualifier("elementoDAO")
    private IElementoDAO elementoDAO;
    
    @Autowired
    @Qualifier("monodrogaDAO")
    private IMonodrogaDAO monodrogaDAO;
    
    @Autowired
    @Qualifier("promedioDAO")
    private IPromedioDAO promedioDAO;
    
    @Autowired
    @Qualifier("bajaLogicaPacienteDAO")
    private IBajaLogicaPacienteDAO bajaLogicaPacienteDAO;
    
    @Autowired
    @Qualifier("grupoEtarioDAO")
    private IGrupoEtarioDAO grupoEtarioDAO;
    
    @Override
    public List<Sexo> obtenerTodosSexos() {
        return sexoDAO.obtenerTodosSexo();
    }

    @Override
    public int obtenerAnioMinimoElementos() {
        Elemento elemento = elementoDAO.obtenerElementoConAnioMinimo();
        Date fechaMinima = elemento.getFecha();
        
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fechaMinima);
        
        return calendar.get(Calendar.YEAR);
    }

    @Override
    public int obtenerAnioActual() {
        Date fechaActual = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fechaActual);
        
        return calendar.get(Calendar.YEAR);
    }

    @Override
    public List<String> obtenerMeses() {
        String arrayMeses[] = {
            "Enero",
            "Febrero",
            "Marzo",
            "Abril",
            "Mayo",
            "Junio",
            "Julio",
            "Agosto",
            "Septiembre",
            "Octubre",
            "Noviembre",
            "Diciembre"
        };
        return Arrays.asList(arrayMeses);
    }

    @Override
    public List<Diagnostico> obtenerDiagnosticosMasComunes(Sexo sexo, int edadDesde, int edadHasta, int anioDesde, int anioHasta, int mesDesde, int mesHasta) {
        return diagnosticoDAO.obtenerDiagnosticos(sexo,edadDesde, edadHasta, anioDesde, anioHasta, mesDesde, mesHasta);
    }

    @Override
    public List<Monodroga> obtenerMedicamentosMasComunes(Sexo sexoSeleccionado, int edadDesde, int edadHasta, int anioDesde, int anioHasta, int mesDesde, int mesHasta) {
        /* sexo puede venir en null cuando me elijen ambos sexos */
        /*Date fechaNacimientoMinima;
        Date fechaNacimientoMaxima;
        
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int anioMinimo = calendar.get(Calendar.YEAR) - edadHasta;
        int anioMaximo = calendar.get(Calendar.YEAR) - edadDesde;
        anioMinimo--; // para que tome el rango desde el inicio, sino, se pierden algunos meses
        // GUARDA CON EL TEMA DE UN DIA ANTES O UN DIA DESPUES
        
        calendar.set(Calendar.YEAR, anioMinimo);
        fechaNacimientoMinima = calendar.getTime();
        
        calendar.set(Calendar.YEAR, anioMaximo);
        fechaNacimientoMaxima = calendar.getTime();*/
        
        return monodrogaDAO.obtenerMonodrogas(sexoSeleccionado, edadDesde, edadHasta, anioDesde, anioHasta, mesDesde, mesHasta);
    }

    @Override
    public Double obtenerPromedioEdades(Diagnostico diagnostico, Sexo sexo, Date fechaDesde) {
        Date fechaHasta;
        GregorianCalendar calendar = new GregorianCalendar();
        
        calendar.clear(); // para que no haga despelote con febrero
        calendar.setTime(fechaDesde);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        fechaHasta = calendar.getTime(); // fechaHasta, es el ultimo dia del mes
        
        return promedioDAO.obtenerPromedioEdades(diagnostico, sexo, fechaDesde, fechaHasta);
    }

    @Override
    public Double obtenerBajasSobreTotalEnFechaEdadesSexo(Sexo sexo, Date fechaDesde, int edadDesde, int edadHasta) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(fechaDesde);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        
        Date fechaHasta = calendar.getTime();
        
        return bajaLogicaPacienteDAO.obtenerBajasSobreTotalEnFechaEdadesSexo(sexo, fechaDesde, fechaHasta, edadDesde, edadHasta);
    }

    @Override
    public List<GrupoEtario> obtenerTodosGruposEtarios() {
        return grupoEtarioDAO.obtenerTodosGruposEtarios();
    }
    
}
